package com.aierjun.ani.net.OkGo;

import android.app.Application;
import android.graphics.Bitmap;
import android.util.Log;

import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.callback.BitmapCallback;
import com.lzy.okgo.callback.Callback;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.cookie.CookieJarImpl;
import com.lzy.okgo.cookie.store.DBCookieStore;
import com.lzy.okgo.cookie.store.MemoryCookieStore;
import com.lzy.okgo.cookie.store.SPCookieStore;
import com.lzy.okgo.https.HttpsUtils;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import com.lzy.okgo.model.HttpHeaders;
import com.lzy.okgo.model.HttpParams;
import com.lzy.okgo.model.Progress;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.base.Request;

import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

import okhttp3.Call;
import okhttp3.OkHttpClient;

/**
 * Created by Ani_aierJun on 2017/10/12.
 */

public class OkGo {

    public void init(Application application, HttpHeaders headers, HttpParams params) {
        //必须调用初始化

        OkHttpClient.Builder builder = new OkHttpClient.Builder();

        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("Ani OkGo");
        //log打印级别，决定了log显示的详细程度
        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
        //log颜色级别，决定了log在控制台显示的颜色
        loggingInterceptor.setColorLevel(Level.INFO);
        builder.addInterceptor(loggingInterceptor);
        //全局的读取超时时间
        builder.readTimeout(com.lzy.okgo.OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        //全局的写入超时时间
        builder.writeTimeout(com.lzy.okgo.OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        //全局的连接超时时间
        builder.connectTimeout(com.lzy.okgo.OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        //使用sp保持cookie，如果cookie不过期，则一直有效
        builder.cookieJar(new CookieJarImpl(new SPCookieStore(application)));
        //使用数据库保持cookie，如果cookie不过期，则一直有效
        builder.cookieJar(new CookieJarImpl(new DBCookieStore(application)));
        //使用内存保持cookie，app退出后，cookie消失
        builder.cookieJar(new CookieJarImpl(new MemoryCookieStore()));

/*        //方法一：信任所有证书,不安全有风险
        HttpsUtils.SSLParams sslParams1 = HttpsUtils.getSslSocketFactory();
        //方法二：自定义信任规则，校验服务端证书
        HttpsUtils.SSLParams sslParams2 = HttpsUtils.getSslSocketFactory(new SafeTrustManager());
        //方法三：使用预埋证书，校验服务端证书（自签名证书）
        HttpsUtils.SSLParams sslParams3 = HttpsUtils.getSslSocketFactory(getAssets().open("srca.cer"));
        //方法四：使用bks证书和密码管理客户端证书（双向认证），使用预埋证书，校验服务端证书（自签名证书）
        HttpsUtils.SSLParams sslParams4 = HttpsUtils.getSslSocketFactory(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"));
        builder.sslSocketFactory(sslParams1.sSLSocketFactory, sslParams1.trustManager);
        //配置https的域名匹配规则，详细看demo的初始化介绍，不需要就不要加入，使用不当会导致https握手失败
        builder.hostnameVerifier(new SafeHostnameVerifier());*/

        //---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//
/*        HttpHeaders headers = new HttpHeaders();
        headers.put("commonHeaderKey1", "commonHeaderValue1");    //header不支持中文，不允许有特殊字符
        headers.put("commonHeaderKey2", "commonHeaderValue2");
        HttpParams params = new HttpParams();
        params.put("commonParamsKey1", "commonParamsValue1");     //param支持中文,直接传,不要自己编码
        params.put("commonParamsKey2", "这里支持中文参数");*/

        if (headers != null && params != null)
            com.lzy.okgo.OkGo.getInstance().init(application)                       //必须调用初始化
                    .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                    .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                    .setRetryCount(3)                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
                    .addCommonHeaders(headers)                      //全局公共头
                    .addCommonParams(params);
        if (headers == null && params != null)
            com.lzy.okgo.OkGo.getInstance().init(application)                       //必须调用初始化
                    .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                    .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                    .setRetryCount(3)                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
                    .addCommonParams(params);
        if (headers != null && params == null)
            com.lzy.okgo.OkGo.getInstance().init(application)                       //必须调用初始化
                    .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                    .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                    .setRetryCount(3)                               //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
                    .addCommonHeaders(headers);
        if (headers == null && params == null)
            com.lzy.okgo.OkGo.getInstance().init(application)                       //必须调用初始化
                    .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                    .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                    .setRetryCount(3);                              //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为
    }

    public void sendGet(String url, String tag, final com.aierjun.ani.interfaces.OkGo.onOkGoResponceString onOkGoResponceString) {
        com.lzy.okgo.OkGo.<String>get(url)
                .tag(tag)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        if (onOkGoResponceString != null)
                            onOkGoResponceString.responce(response.toString());
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                    }
                });
    }

    public void sendPostTestSample(String url, String tag, HttpHeaders headers, HttpParams httpParams) {
        com.lzy.okgo.OkGo.<Object>post(url)
                .tag(tag)
                .isMultipart(true)//该方法表示是否强制使用multipart/form-data表单上传
                .isSpliceUrl(true)//该方法表示是否强制将params的参数拼接到url后面
                .retryCount(3)  //该方法是配置超时重连次数
                .cacheKey("aniCacheKey")//这三个是缓存相关的配置
                .cacheTime(5000)
                .cacheMode(CacheMode.DEFAULT)
                .headers(headers)//添加请求头
                .params(httpParams) //添加params
                .addUrlParams("", null)//支持一个key传递多个参数
                .addFileParams("", null) //支持一个key传递多个文件
                .addFileWrapperParams("", null) //支持一个key传多个文件
                .execute(new Callback<Object>() {
                    @Override
                    public void onStart(Request<Object, ? extends Request> request) {
                        //ui线程 请求网络之前调用
                    }

                    @Override
                    public void onSuccess(Response<Object> response) {
                        //ui线程
                    }

                    @Override
                    public void onCacheSuccess(Response<Object> response) {
                        //ui线程 缓存读取成功后
                    }

                    @Override
                    public void onError(Response<Object> response) {
                        //ui线程
                    }

                    @Override
                    public void onFinish() {
                        //ui线程 无论成功失败都会调用
                    }

                    @Override
                    public void uploadProgress(Progress progress) {
                        //ui线程 文件上传过程回调，只有请求方式包含请求体才会回调
                    }

                    @Override
                    public void downloadProgress(Progress progress) {
                        //ui线程 文件下载过程回调
                    }

                    @Override
                    public Object convertResponse(okhttp3.Response response) throws Throwable {
                        //子线程
                        //根据传递尽量的responce对象，把数据解析成需要的Object类型并返回
                        //可以根据自己的需要抛出异常，在onError中处理
                        return null;
                    }
                });

    }

    public void getBitMap(String url, String tag) {
        com.lzy.okgo.OkGo.<Bitmap>get(url)
                .tag(tag)
                .execute(new BitmapCallback() {
                    @Override
                    public void onSuccess(Response<Bitmap> response) {

                    }
                });
    }

}
